﻿/*
题目：字符串解码

给定一个经过编码的字符串，返回它解码后的字符串。

编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。

此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像 3a 或 2[4] 的输入。

https://leetcode.cn/problems/find-two-non-overlapping-sub-arrays-each-with-target-sum/description/
*/

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <array>
#include "TreeNode.hpp"
#include "ListNode.hpp"
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <functional>
#include <random>

using namespace std;

class Solution {
public:
    string decodeString(string s) {
        vector<char> stk;

        for (int i = 0; i < s.size(); i++) {
            if (s[i] != ']') {
                stk.push_back(s[i]);
            }
            else {      // 遇到右括号
                // 先将 [] 中的字母提出来
                string lv;
                while (!stk.empty()) {
                    if (stk.back() != '[') {
                        lv += stk.back();
                        stk.pop_back();
                    }
                    else {
                        stk.pop_back();
                        break;
                    }
                }
                std::reverse(lv.begin(), lv.end());

                // 再将数字提出来
                string num;
                while (!stk.empty() && isdigit(stk.back())) {
                    num += stk.back();
                    stk.pop_back();
                }
                std::reverse(num.begin(), num.end());

                // 再压回去
                for (int i = 0; i < std::stoi(num); i++) {
                    for_each(lv.begin(), lv.end(), [&stk](char ch) { stk.push_back(ch); });
                }
            }
        }

        string res;
        for (auto ch : stk)  res += ch;
        return res;
    }
};